package com.example.demo4test;

import java.util.*;

/**
 * 房间类
 */
public class Room {
    // 1.准备54张牌，给房间使用，定义一个集合容器装54张牌
    private List<Card> allCards = new ArrayList<>();

    // 2.初始化54张牌进去
    {
        // 3.准备点数
        String[] sizes = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        // 4.准备花色
        String[] colors = {"♥", "♦", "♣", "♠"};
        // 5.组合点数和花色成为牌对象，加入到集合中去
        int num = 0;
        for (String size : sizes) {
            num++;
            for (String color : colors) {
                // 6、创建牌对象
                Card card = new Card(size, color, num);
                // 7、加入到集合中去
                allCards.add(card);
            }
        }
//        allCards.add(new Card("", "🃏"));
//        allCards.add(new Card("", "👲"));
        Collections.addAll(allCards, new Card("", "🃏", ++num), new Card("", "👲", ++num));
        System.out.println("新牌是：" + allCards);
    }

    public void start() {
        // 8.洗牌：随机打乱集合中的顺序。
        Collections.shuffle(allCards);
        System.out.println("洗牌后：" + allCards);

        // 9.发牌 : 定义三个玩家： 令狐冲=【】，令狐白=【】，令狐紫=【】
        Map<String, List<Card>> players = new HashMap<>();

        List<Card> lhc = new ArrayList<>();
        players.put("令狐冲", lhc);

        List<Card> lhb = new ArrayList<>();
        players.put("令狐白", lhb);

        List<Card> lhz = new ArrayList<>();
        players.put("令狐紫", lhz);

        // allCards = [7♠, 6♣, K♦, J♠, 2♠, 2♥, 9♠, 10♣, J♣, 8♦, 7♣, 8♣, 7♦, 3♥, 10 ...
        // 只发出去51张：0   1    2   3   4   5   6   7 ...
        for (int i = 0; i < allCards.size() - 3; i++) {
            // 获取到当前遍历的牌
            Card card = allCards.get(i);
            // 判断当前这张牌发给谁
            if (i % 3 == 0) {
                // 请啊冲接牌
                lhc.add(card);
            } else if (i % 3 == 1) {
                // 请啊白接牌
                lhb.add(card);
            } else if (i % 3 == 2) {
                // 请啊紫接牌
                lhz.add(card);
            }
        }

        // 10.拿最后三种底牌：
        List<Card> lastCards = allCards.subList(allCards.size() - 3, allCards.size());
        System.out.println("底牌：" + lastCards);

        // 为什么把最后三个牌放到集合中，因为到时候抢地主的时候，可以直接把这个集合，加入到玩家的集合中去
        // 抢地主：把这个集合直接倒给玩家
        lhz.addAll(lastCards);

        // 11.对牌排序（交给大家自己做）
        sortCards(lhc);
        sortCards(lhb);
        sortCards(lhz);

        // 12.看牌，遍历map集合
//        for (Map.Entry<String, List<Card>> entry : players.entrySet()) {
//            // 获取键
//            String name = entry.getKey();
//            // 获取值
//            List<Card> cards = entry.getValue();
//            // 遍历值的集合
//            System.out.println(name + "：" + cards);
//        }

        // 使用Lambda遍历map集合
        players.forEach((k, v) -> System.out.println(k + ":" + v));
    }

    private void sortCards(List<Card> cards) {
        /*
        实现思路
        1.给Card类增加一个属性：num，用于表示牌的大小
        2.每遍历完一个点数，就给num++
        3.最后使用num就可以表示牌的大小了
         */
//        Collections.sort(cards, new Comparator<Card>() {
//            @Override
//            public int compare(Card o1, Card o2) {
//                return o2.getNum() - o1.getNum();
//            }
//        });

        // 使用Lambda表达式简化
        Collections.sort(cards, (o1, o2) -> o2.getNum() - o1.getNum());
    }
}
